package com.hopu.v1.service.admin.system.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hopu.v1.exception.BusinessException;
import com.hopu.v1.mapper.admin.system.RoleMapper;
import com.hopu.v1.pojo.system.Role;
import com.hopu.v1.service.admin.system.RoleService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author YwaiX
 * @since 2024-09-12
 */
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
    @Resource
    private RoleMapper roleMapper;

    @Override
    public void update(Role role) {

        // 检查角色ID是否为空
        if (role.getId() == null) {
            throw new BusinessException("ID不能为空");
        }

        // 获取数据库中的原始角色信息
        Role existingRole = getById(role.getId());

        // 角色名是否被修改
        boolean roleNameChanged = !Objects.equals(existingRole.getRoleName(), role.getRoleName());
        // 角色描述是否被修改
        boolean roleDescChanged = !Objects.equals(existingRole.getRoleDesc(), role.getRoleDesc());

        // 情况1: 角色描述为空且角色名没有改变
        if (role.getRoleDesc() == null && !roleNameChanged) {
            // 更新其他字段
            updateById(role);
            return;
        }

        // 情况2: 角色描述不为空且角色名也不为空
        if (role.getRoleDesc() != null && roleNameChanged) {
            // 检查新的角色名是否已存在
            LambdaQueryWrapper<Role> wrapper = new LambdaQueryWrapper<Role>()
                    .eq(Role::getRoleName, role.getRoleName())
                    .ne(Role::getId, role.getId()); // 排除当前角色

            Role roleWithSameName = getOne(wrapper);
            if (roleWithSameName != null) {
                throw new BusinessException("该角色名已存在，请更换其他角色名");
            }

            // 更新角色名和角色描述
            updateById(role);
            return;
        }

        // 情况3: 角色名和角色描述都没有修改
        if (!roleNameChanged && !roleDescChanged) {
            throw new BusinessException("角色名和角色描述都没有修改，无需更新");
        }

        // 情况4: 角色描述为空且角色名没有修改过
        if (role.getRoleDesc() == null && roleNameChanged) {
            // 检查新的角色名是否已存在
            LambdaQueryWrapper<Role> wrapper = new LambdaQueryWrapper<Role>()
                    .eq(Role::getRoleName, role.getRoleName())
                    .ne(Role::getId, role.getId()); // 排除当前角色

            Role roleWithSameName = getOne(wrapper);
            if (roleWithSameName != null) {
                throw new BusinessException("该角色名已存在，请更换其他角色名");
            }

            // 更新角色名
            updateById(role);
            return;
        }

        // 如果以上条件都不满足，则默认更新
        updateById(role);
    }

    @Override
    public void updateStatus(Role role) {
        if (role.getId() == null) {
            throw new BusinessException("ID不能为空");
        }
        baseMapper.updateById(role);
    }

    @Override
    public String add(Role role) {
        LambdaQueryWrapper<Role> wrapper = new LambdaQueryWrapper<Role>().eq(Role::getRoleName, role.getRoleName());
        Role role1 = getOne(wrapper);
        if (role1 != null) {
            throw new BusinessException("该角色名已存在，请更换其他角色名");
        }
        save(role);
        return "添加成功";
    }

    @Override
    public List<Role> getRoleById(Integer roleId) {
        return roleMapper.getRoleById(roleId);
    }

    @Override
    public void deleteStaff(List<Integer> ids) {
        baseMapper.deleteByIds(ids);
    }


}
